﻿using System;
using System.Collections.Generic;
using AccesoDatos.IDAO;
using Entidades;
using log4net;
using NHibernate;


namespace AccesoDatos.DAO
{
    public class DaoEvento : IDaoEvento
    {
        protected static readonly ILog log = LogManager.GetLogger(typeof(DaoEvento));
        
        /// <summary>
        /// Metodo que me retorna un la lista de 
        /// todos los eventos de la bd
        /// </summary>
        
        public IList<Evento> SeleccionarTodos()
        {
            ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
            sesion.BeginTransaction();
            IQuery query = sesion.CreateQuery("from Evento");
            IList<Evento> retorna = (IList<Evento>)query.List<Evento>();
            sesion.Transaction.Commit();
            log4net.Config.XmlConfigurator.Configure();

            log.Warn("Lista de todos los eventos retornada con exito");
            return retorna;
            
        }

        /// <summary>
        /// Metodo que me regresa un objeto de tipo
        /// Evento que tenga el id que le paso por parametro
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>

        public Evento SeleccionarPorId(int id)
        {
            ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
            sesion.BeginTransaction();
            Evento busqueda = (Evento)sesion.Get(typeof(Evento), id);
            sesion.Transaction.Commit();
            log4net.Config.XmlConfigurator.Configure();

            log.Warn("Lista del evento retornada con exito");
            return busqueda;
        }

        /// <summary>
        /// Metodo que recibe un objeto tomado
        /// del formulario y lo inserta en la 
        /// bd 
        /// </summary>
        
        public void Insertar(Evento c)
        {
            
            ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
            ITransaction transaccion = null;
            try
            {
                transaccion = sesion.BeginTransaction();
                sesion.Save(c);
                transaccion.Commit();
                log4net.Config.XmlConfigurator.Configure();

                log.Warn("Insercion de evento realizada con exito");
                sesion.Flush();

            }
            catch (Exception e)
            {
                e.GetBaseException();
                if (transaccion != null)
                {
                    log4net.Config.XmlConfigurator.Configure();

                    log.Warn("No se agrego el evento");
                    transaccion.Rollback();
                    throw;
                }
            }

        }

        /// <summary>
        /// Metodo para que recibe un objeto
        /// de tipo evento y setea con los valores que fueron itroducidos
        /// en el formulario
        /// </summary>
        

        public void Modificar(Evento c)
        {
            ConfiguracionNHibernate.CloseSession();
            ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
            sesion.BeginTransaction();
            sesion.Update(c);
            
            sesion.Transaction.Commit();
            log4net.Config.XmlConfigurator.Configure();

            log.Warn("Evento Modificado con exito");

        }

        /// <summary>
        /// Recibe el id del evento que se desea eliminar
        /// y lo elimina de la bd
        /// </summary>
        
        public void EliminarPorId(int id)
        {
            ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
            sesion.BeginTransaction();
            sesion.Delete((Evento)sesion.Get(typeof(Evento), id));
            sesion.Transaction.Commit();
            log4net.Config.XmlConfigurator.Configure();

            log.Warn("Evento Eliminado con exito");
        }

        public IList<Evento> SeleccionarPorParametro(string parametro, string valor)
        {
            throw new NotImplementedException();
        }

        public IList<Evento> SeleccionarPorParametro(string parametro, int valor)
        {
            throw new NotImplementedException();
        }

        /// <summary>
        /// Rertona un IList de Evento que se encuentran 
        /// registrados en el sistema
        /// </summary>
        
        public IList<Evento> ListarEventosregistrados()
        {
            ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
            sesion.BeginTransaction();
            IQuery query = sesion.CreateQuery("from Evento");
            IList<Evento> eventos = (IList<Evento>)query.List<Evento>();
            sesion.Transaction.Commit();
            log4net.Config.XmlConfigurator.Configure();

            log.Warn("Eventos retornados con exito");
            return eventos;
        }

        /// <summary>
        /// Recibe el id de categoria y regresa 
        /// la lista de eventos donde esta asociada esta categoria
        /// </summary>
        /// <param name="idcategoria"></param>
        /// <returns></returns>

        public IList<Evento> VerificarCategoriaEvento(int idcategoria)
        {
            ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
            sesion.BeginTransaction();
            IQuery query = sesion.CreateQuery("from Evento where fkcategoria =" + idcategoria);
            IList<Evento> retorna = (IList<Evento>)query.List<Evento>();
            sesion.Transaction.Commit();
            log4net.Config.XmlConfigurator.Configure();

            log.Warn("Lista de Eventos asociados a esa categoria retornado con exito");

            return retorna;
        }
        /// <summary>
        /// Me retorna el id de evento 
        /// utilizo un for each para me recorra el objeto hasta 
        /// que encuentre el id evento que le pase
        ///
        /// </summary>
        /// <param name="even"></param>
        /// <returns></returns>
        public int TraerIdEventoHistorialEvento(IList<Evento> even)
        {
            
            
            foreach (Evento evento in even)
            {
                ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
                sesion.BeginTransaction();
                IQuery query = sesion.CreateQuery("FROM HISTORIALEVENTO WHERE" + "FKEVENTO" + evento.Idevento);
                IList<Evento> lista = (IList<Evento>) query.List<Evento>();
                sesion.Transaction.Commit();
                if (lista != null)
                {
                    return 0;
                }
                else
                {
                    return 1;
                }
                
            }
            return 2;

        }
       }
    }
